/*
 * pasajero.cpp
 *
 *  Created on: Oct 10, 2013
 *      Author: m
 */

/*
 * El nº de vuelo se selecciona aleatoriamente.
 * Los vuelos son números consecutivos de 1 a N, donde N se pasa por parámetro.
 *
 */

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include "CPrinter.h"
#include "DefinicionesComunes.h"
#include "Sequence.h"
#include "EstacionDepositoEquipaje.h"

#define ARG_CANT_VUELOS 1
#define MAX_VALIJAS 5
#define ITEMS_EQUIPAJE_FILE "itemsEquipaje.txt"
#define PROBABILIDAD_DE_CONTENER_UN_ITEM 5

using namespace ipc;

int main ( int argc, char* argv[] )
{
    IdPasajero idPasajero;
    IdVuelo idVuelo;
    int nVuelos;
    int nEquipaje;
    std::list< std::string > itemsEquipaje;
    std::ifstream itemsEquipajeFile;
    std::string Buffer;
    std::stringstream ss;
    EstacionDepositoEquipaje cintaDepositoEquipaje;

    srand( time( NULL ) );

    /*
     * Obtengo el ID del pasajero
     */
    idPasajero = Sequence::get( IPC_BASE_FILE, SEQ_ID_PASAJERO ).getNext();

    CPrinter::setHeader( "pasajero", idPasajero );

    /*
     * Parseo los argumentos:
     *  argv[1] : Cantidad de vuelos disponibles
     */

    if ( argc != 2 )
    {
        CPrinter::printErr( "ERROR: Cantidad de Argumentos Invalida.\n"
                "USO:\t\tpasajero [Vuelos disponibles]" );
        exit(1);
    }
    ss.str( argv[ARG_CANT_VUELOS] );
    ss >> std::skipws >> nVuelos;

    if ( nVuelos <= 0 )
    {
        CPrinter::printErr( "ERROR: La cantidad de vuelos disponibles"
                " debe ser mayor a cero" );
        exit(2);
    }

    /*
     *  Cargo los items que pueden contener las valijas de un archivo
     */
    itemsEquipajeFile.open( ITEMS_EQUIPAJE_FILE );

    while ( itemsEquipajeFile >> Buffer )
    {
        itemsEquipaje.push_back( Buffer );
    }

    /*
     * Selecciono el vuelo del pasajero
     */
    idVuelo = ( random() % nVuelos ) + 1;

    CPrinter::printOut( "Tomare el vuelo %d", idVuelo );

    /*
     * Genero su equipaje:
     *
     * 1. Selecciono la cantidad de valijas que lleva el pasajero
     * 2. Para cada valija decido su contenido de la lista de items
     *     que pueden estar contenidos en el equipaje (incluye sustancias
     *     peligrosas y otras no peligrosas)
     * 3. deposito cada valija en la estación de deposito de equipaje
     */
    nEquipaje = ( random() % MAX_VALIJAS ) + 1;

    CPrinter::printOut( "Depositare %d equipajes", nEquipaje );

    for ( int i = 0; i < nEquipaje; i++ )
    {
        Equipaje equipaje;

        for ( std::list<std::string>::iterator it = itemsEquipaje.begin();
              it != itemsEquipaje.end(); it++ )
        {
            // Probablidiad de 1/PROBABILIDAD_DE_CONTENER_UN_ITEM
            bool contieneItem = random() % PROBABILIDAD_DE_CONTENER_UN_ITEM == 0;

            if ( contieneItem )
            {
                equipaje.push_back( *it );
            }
        }

        CPrinter::printOut( "Depositando el equipaje numero %d", i );

        sleep( random() % 5 );

        cintaDepositoEquipaje.depositarEquipaje( equipaje, idVuelo );
    }

    CPrinter::printOut( "Termine de depositar todo el equipaje" );

    return 0;
}
